#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>

//#define N 10
//typedef int STDataType;
//typedef struct Stack
//{
//	STDataType a[N];
//	int top;
//}ST;


typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

// 生成的函数名已经符合C的规则，但是C程序不认识extern "C"，只有C++的编译器才认识，C语言的编译器中没有这条规则
// error C2059: 语法错误:“字符串”
// 使用C++的宏，进行条件编译可以解决
#ifdef __cplusplus
extern "C"			// C中没有这个规则，而C++中有这个规则，这是C++生成的静态库，而预处理、宏替换之后就没有这段内容了，C程序可以通过编译
// extern "C" 的用途是告诉编译器按照C的规则去编译函数（主要是对符号表的影响）
// 那用了这种方法之后，C++的函数重载是否还能使用？ 不能。所以要是C调用CPP写的库，不要用重载
{
#endif // __cplusplus
	// 告知g++，生成符号表中的函数名的时候，按照C的规则进行生成，不需要进行函数名修饰
	// C中的函数名：<StackInit>：C++中的函数名：<_Z9StackInitST*>
	// 函数名不同，无法通过函数名正确寻址，因此出现了链接错误
	void StackInit(ST* ps);
	void StackDestroy(ST* ps);
	void StackPush(ST* ps, STDataType x);
	void StackPop(ST* ps);
	STDataType StackTop(ST* ps);
	bool StackEmpty(ST* ps);
	int StackSize(ST* ps);
#ifdef __cplusplus
}
#endif // __cplusplus